<?php

class application extends applicationEngine {
 
    public $defaultPage = 'home';
    
    public function init(){
        
        # Pagina's die we kunnen openen
        $this->addPage('home','$this->pageHome();');
        $this->addPage('reisinformatie','$this->pageReisinformatie();');
        $this->addPage('boekingsbevestiging','$this->pageBoekingsbevestiging();');
        $this->addPage('zoeken','$this->pageZoeken();');
	
        # Pagina's die we kunnen openen - (van het besteltraject)
        $this->addPage('persoonlijkeInformatie','$this->pagePersoonlijkeInformatie();'); 
        $this->addPage('startBoeking','$this->pageStartBoeking();');
        $this->addPage('deelnemerToevoegen','$this->pageDeelnemersToevoegen();');
        $this->addPage('deelnemerToevoegenForm','$this->pageDeelnemersToevoegenForm();'); 
        $this->addPage('bevestiging','$this->pageBevestiging();');
        $this->addPage('boekingOpslaan','$this->pageboekingOpslaan();'); 
        
        # Formulieren die we gebruiken binnen de applicatie
        $this->addForm('betaalgegevens');
        $this->addForm('deelnemertoevoegen');
        $this->addForm('zoeken');
        
        # Functies die vanuit ajax aanroepbaar zijn
        $this->addFunction('deelnemerVerwijderen','$this->requestDeelnemerVerwijderen();');
        $this->addFunction('deelnemerTabelInhoud','$this->requestDeelnemerTabelInhoud();');
        
        parent::init();
    }
    
    
    public function createMainMenu() {
        
        $mainMenu = array(
            'home'=>'Home'
        );
        
        $html = '';
        foreach($mainMenu as $pageAddress => $description) {
            $html .= '<li><a href="index.php?page='.$pageAddress.'">'.$description.'</a></li>';
        }
        
        return $html;
        
    }
    
    
    public function createMainPage($titel = '', $tekst = '', $toonZoeken = true) {
        
        $page = parent::createMainPage();
        
        # design van website inladen
        $page->addCssFile('style', false);
        $page->appendTemplate('design','mainContent',false);
        
        # menuitems toevoegen op dynamische wijze
        $page->assign($this->createMainMenu(),'mainmenuTag');
        
        if($titel != '') {
            $titel = '<h1>'.$titel.'</h1>';
            $page->assign($titel,'paginaTitelTag');
        }
        
        if($tekst != '') {
            $tekst = '<div class="inleiding">'.$tekst.'</div>';
            $page->assign($tekst,'paginaTekstTag');
        }
        
        # items aan de sidebar toevoegen
        //$page->appendTemplate('sidebarZoeken','sidebarZoekenTag');
        //$page->appendTemplate('sidebarReistype','sidebarReistypeTag');
        
        if($toonZoeken) {
            $page->appendTemplate('zoekenvenster','sidebarZoekenTag');
            $this->loadForm('zoeken', $page, 'zoekenFormTag');
        }
        
        return $page;
        
    }
    
    public function createIframePage() {
        
        $page = parent::createIframePage();
        $page->addCssFile('iframe', false);
        $page->append('<--iframeContent-->','mainContent');
        
        return $page;
        
    }
    
    protected function pageError($errorMsg) {
        
        $page = $this->createMainPage();
        
        $page->assign(($errorMsg!=null)?$errorMsg :'De pagina die u zocht is helaas niet gevonden.','contentTag');
        
    }
    
    public function pageHome() {
        
        $page = $this->createMainPage();
        
        $shoestringDatabase = shoestringDatabaseObject::instantiateShoestring();
        $reizen = $shoestringDatabase->getAanbiedingen();

        $page->appendTemplate('aanbiedingenHome','contentTag');
        
        foreach($reizen as $reis) {
            $page->appendTemplate('randomReis','randomReizen', true);
            $page->assign($reis['image'],'afbeelding', true);
            $page->assign(cutTextByWordcount($reis['beschrijving'], 15),'beschrijving', true);
            $page->assign($reis['reis_id'],'reisID', true);
            $page->assign($reis['prijsVanaf'],'prijsVanaf', true);
        }
        
    }
    
    public function pageReisinformatie() {
        
        $titel = 'Reisinformatie';
        
        $page = $this->createMainPage($titel);
        
        $reisID = $_GET['reisID'];
        
        $shoestringDatabase = shoestringDatabaseObject::instantiateShoestring();
        $reis = $shoestringDatabase->getReis($reisID);
        
        $page->appendTemplate('reisInformatie','contentTag');
        $page->assign($reis['titel'],'reisTitel');
        $page->assign($reis['land'],'reisBestemming');
        $page->assign($reis['aantaldagen'],'reisDuur');
        $page->assign($reis['beschrijving'],'reisBeschrijving');
        $page->assign($reis['image'],'reisAfbeeldingTag');
        $page->assign($reis['reis_id'],'reisID');
        $page->assign(($reis['max_leeftijd']==0)?'geen':$reis['max_leeftijd'],'maxLeeftijd');
        // voor constraint moeten we de max_leeftijd onthouden
        $_SESSION['reisinfo']['max_leeftijd'] = $reis['max_leeftijd'];
        
        $planningen = $shoestringDatabase->getReisPlanning($reisID);
        
        $page->appendTemplate('planningOverzicht','planningOverzicht');
        
        foreach($planningen as $planning) {
            $page->appendTemplate('planningRegel','planningRegel', true);
            $page->assign($planning['startdatum'],'vertrekDatum',true);
            $page->assign($planning['vertrekpunt'],'vertrekPlaats',true);
            $beschikbaar = $shoestringDatabase->getBeschikbaar($planning['planning_id']);
            $page->assign($beschikbaar,'aantalDeelnemers',true);
            $page->assign($planning['prijs'],'prijs',true);
            $page->assign($reisID,'reisid',true);
            $page->assign($planning['planning_id'],'planningid',true);
        }
				
				# Voor het boeken van een reis moeten we beginnen met een lege sessie
				unset($_SESSION['besteltraject']);
				
    }
    
    public function pageDeelnemersToevoegen() {
			
				if(isset($_GET['reisid'])) {
					$_SESSION['besteltraject']['reisid'] = $_GET['reisid'];
				}
				
				if(isset($_GET['planningid'])) {
					$_SESSION['besteltraject']['planningid'] = $_GET['planningid'];
				}
				
        $titel = 'Deelnemers toevoegen';

        try {
            shoestringConstraints::checkBeschikbaar(
            $_SESSION['besteltraject']['planningid'],
            $_SESSION['besteltraject']['deelnemers']+1);

            $inleiding = 'U kunt de gewenste deelnemers toevoegen aan de reis.';

            $page = $this->createMainPage($titel, $inleiding, false);

            # Template toevoegen met stappen
            $page->appendTemplate('boekingsStappen','contentTag');
            $page->assign('actief','stap1Actief');

            $page->appendTemplate('overzichtDeelnemers','contentTag');

            $page->append('<br/><br/><input type="button" value="Doorgaan" class="buttonDoorgaanExtern" onclick="window.location=\'index.php?page=persoonlijkeInformatie\'">','contentTag');

            # Javascriptfunctionaliteit toevoegen aan de pagina
            $page->addJavascriptFile('boekingen', false);

            # Indien gebruiker schakelt tussen pagina's van besteltraject generen we default het overzicht van toegevoegde gebruikers
            $deelnemerTabel = $this->requestDeelnemerTabelInhoud(true);
            $page->append($deelnemerTabel,'deelnemerRegels');
        } catch(Exception $e) {
            $inleiding = $e->getMessage();
            $page = $this->createMainPage($titel, $inleiding);
        }
        
    }
    
    public function pageDeelnemersToevoegenForm() {
        
        $page = $this->createIframePage();
        $page = $this->loadForm('deelnemertoevoegen', $page, 'iframeContent');
        
    }
    
    
    public function pagePersoonlijkeInformatie() {
        
        if(count($_SESSION['besteltraject']['deelnemers']) == 0) {
            
            $this->pageDeelnemersToevoegen();
            
        } else {
        
            $titel = 'Betaalgegevens';
            $inleiding = 'Gelieve de onderstaande informatie in te voeren door de hoofdboeker van de reis. De onderstaande gegevens zullen gebruikt worden op de factuur. ';

            $page = $this->createMainPage($titel, $inleiding, false);
            
            # Javascriptfunctionaliteit toevoegen aan de pagina
            $page->addJavascriptFile('boekingen', false);

            $page->appendTemplate('boekingsStappen','contentTag');
            $page->assign('actief','stap2Actief');

            $page = $this->loadForm('betaalgegevens', $page, 'contentTag');
            
        }
        
    }
    
    
    public function pageBevestiging() {
        
        if(!isset($_SESSION['besteltraject']['betaalgegevens'])) {
            
           # Er zijn geen deelnemers toegevoegd
           $this->pageDeelnemersToevoegen();
           
        } else {
            
            $titel = 'Bevestig uw gegevens';
            $inleiding = 'U staat op het punt uw bestelling af te sluiten. Controleer uw gegevens en druk op bevestigen.';

            $page = $this->createMainPage($titel, $inleiding, false);

            # Template toevoegen met stappen
            $page->appendTemplate('boekingsStappen','contentTag');
            $page->assign('actief','stap3Actief');

            $betaalgegevens = $_SESSION['besteltraject']['betaalgegevens'];
            $deelnemers = $_SESSION['besteltraject']['deelnemers'];

            if(isset($_SESSION['besteltraject']['betaalgegevens']['vluchtverlenging'])) {
                $page->appendTemplate('vluchtverlenging','contentTag');
                $page->assign($_SESSION['besteltraject']['betaalgegevens']['aantal_verlengings_dagen'],'aantalDagenVerlenging');
            }
            
            $page->appendTemplate('betaalgegevensOverzicht','contentTag');
            
            $page->assign($betaalgegevens['voornaam'] . ' ' . $betaalgegevens['achternaam'],'betaalgegevensNaam');
            $page->assign($betaalgegevens['adres'],'betaalgegevensAdres');
            $page->assign($betaalgegevens['woonplaats'],'betaalgegevensWoonplaats');
            $page->assign($betaalgegevens['postcode'],'betaalgegevensPostcode');
            $page->assign($betaalgegevens['bankaccount'],'betaalgegevensBankrekening');
            $page->assign($betaalgegevens['email'],'betaalgegevensEmail');

            
            $prijsPerDeelnemer = $this->getPrijsPerDeelnemer($deelnemers);
            $totaalprijs = 0;
						
            $deelnemerGevonden = false;
            foreach($deelnemers as $deelnemer){
            	$html = "
                 <tr>
                    <td>".$deelnemer['voornaam']." ".$deelnemer['achternaam']."</td>
                    <td>".$deelnemer['woonplaats']."</td>
                    <td>".$deelnemer['geboortedatum']."</td>
                    <td>".$deelnemer['email']."</td>
                    <td> &euro; ".$prijsPerDeelnemer."</td>
                 </tr>";

                $totaalprijs = $totaalprijs + $prijsPerDeelnemer;
								
                $page->append($html,'deelnemersOverzicht');
                $deelnemerGevonden = true;
            }
						
            $html = "
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td style='border-top: 1px solid #000;'> &euro; ".$totaalprijs."</td>
                </tr>";

            $page->append($html,'deelnemersOverzicht');
						
            if($deelnemerGevonden == false){
                $page->append('<tr><td colspan="99">Geen deelnemers toegevoegd</tr></td>','deelnemersOverzicht');
            }
            
        }
        
    }
    
    
    public function pageboekingOpslaan(){
        
        # Databaseobject ophalen
        $shoestringDatabase = shoestringDatabaseObject::instantiateShoestring();
        
        # Besteltrajectgegevens ophalen
        $planningID = $_SESSION['besteltraject']['planningid'];
        $deelnemers = $_SESSION['besteltraject']['deelnemers'];
        $vluchtverlenging = (isset($_SESSION['besteltraject']['betaalgegevens']['vluchtverlenging']) ? 1 : '');
        $aantalDagenVerlenging = (isset($_SESSION['besteltraject']['betaalgegevens']['aantal_verlengings_dagen']) ? $_SESSION['besteltraject']['betaalgegevens']['aantal_verlengings_dagen'] : '');
        $verlengingsKosten = (isset($_SESSION['besteltraject']['betaalgegevens']['vluchtverlenging']) ? 75 : '');
        
        unset($_SESSION['besteltraject']['betaalgegevens']['vluchtverlenging']);
        unset($_SESSION['besteltraject']['betaalgegevens']['aantal_verlengings_dagen']);
        
        $betaalgegevens = $_SESSION['besteltraject']['betaalgegevens']; // Boeker
        
        shoestringConstraints::checkBeschikbaar($planningID, sizeof($deelnemers));
        # Boeker toevoegen aan persoontabel
        $boekerID = $shoestringDatabase->addPersoon($betaalgegevens);
        
        $reservering = array(
            "planning_id" => $planningID,
            "geboekt_door" => $boekerID,
            "prijs" => "",
            "boekingsdatum" => date("Y-m-d"),
            "vluchtverlenging" => $vluchtverlenging,
            "aantal_verlengings_dagen" => $aantalDagenVerlenging,
            "vluchtverlengings_kosten" => 75,
            "aantaldeelnemers" => "",
            "betaald" => 0
        );
        
        # Reservering toevoegen
        $reserveringID = $shoestringDatabase->addReservering($reservering);
        
        foreach($deelnemers as $deelnemer) {
            
            # Deelnemer toevoegen
            $newPersoonID = $shoestringDatabase->addPersoon($deelnemer);
            
            $deelnemerFields = array(
                'persoon_id' => $newPersoonID,
                'reservering_id' => $reserveringID
            );
            
            # Deelnemer toevoegen aan deelnemertabel
            $shoestringDatabase->addDeelnemer($deelnemerFields);
        }
            
        # Besteltrajectgegevens unsetten
        unset($_SESSION['besteltraject']);
        
        $titel = 'Bestelling voltooid';
        $inleiding = 'Bedankt voor uw bestelling! <br/><br/> Uw bestelling is in goede orde ontvangen en opgeslagen. De factuur zal u zo spoedig mogelijk per post worden toegezonden. Indien de betaling is afgehandeld ontvangt u de nodige informatie over uw reis en verblijf. <br/></br> Met vriendelijke groet, <br/>Shoestring';
        
        # We gaan de homepage openen
        $page = $this->createMainPage($titel, $inleiding, false);
        
    }
    
    
    private function getPrijsPerDeelnemer($deelnemers) {

        # TODO: deze query omzetten naar shoestringDatabaseObject
        $query = 'SELECT (prijs_vlucht + prijs_overnachtingen + prijs_vervoer + prijs_gids + prijs_eten + boekings_kosten + luchthavenbelasting) AS prijs 
                FROM planning WHERE planning_id = ' .  $_SESSION['besteltraject']['planningid'];
        $result = mysql_fetch_assoc(mysql_query($query));

        # Orginele prijs van deze reis
        $orginelePrijs = $result['prijs'];

        # Bepaal het aantal deelnemers
        $aantalDeelnemers = count($deelnemers);

        # TODO: deze query omzetten naar shoestringDatabaseObject
        # Haal de korting op op basis van het aantal deelnemers
        $query = 'SELECT korting FROM korting 
                WHERE min_deelnemers <= '.$aantalDeelnemers.' 
                ORDER BY korting DESC
                LIMIT 0,1 ';
        $result = mysql_fetch_assoc(mysql_query($query));

        if($result['korting'] != null){
                $kortingsPercentage = $result['korting'];
        } else {
                $kortingsPercentage = 0;
        }

        $berekendePrijs = $orginelePrijs - (($kortingsPercentage / 100) * $orginelePrijs);

        return $berekendePrijs;

    }
    
    
    public function requestDeelnemerTabelInhoud($outputAlsVar = false) {
        
        $deelnemers = $_SESSION['besteltraject']['deelnemers'];
        $deelnemerToegevoegd = false;
        
        # Bereken de prijs per deelnemer inc kortingen
        $berekendePrijs = $this->getPrijsPerDeelnemer($deelnemers);
				
        $html = '';
        $totaalprijs = 0;
        foreach($deelnemers as $deelnemerID => $deelnemer) {
           $html .= "<div class='deelnemer' id='deelnemer".$deelnemerID."'>";
           $html .= "<div class='deelnemerCell Naam'>".$deelnemer['voornaam']." ".$deelnemer['achternaam']."</div>";
           $html .= "<div class='deelnemerCell Adres'>".$deelnemer['adres']."</div>";
           $html .= "<div class='deelnemerCell Postcode'>".$deelnemer['postcode']."</div>";
					 $html .= "<div class='deelnemerCell Prijs'> &euro; ".$berekendePrijs." </div>";
           $html .= "<div class='deelnemerCell Acties'> <img src='images/icons/delete.png' class='deleteDeelnemer' onclick='deelnemerVerwijderenTabel(".$deelnemerID.")'/> </div>";
           $html .= "<div class='clear'></div>";
           $html .= "</div>";
           
           $html .= "<div class='clear'></div>";

           $totaalprijs = $totaalprijs + $berekendePrijs;
           $deelnemerToegevoegd = true;
        }
        
        $html .= "<div class='deelnemerFooter'>";
        $html .= "<div class='spacer'></div>";
        $html .= "<div class='prijstitel'>Totaal : </div>";
        $html .= "<div class='totaalprijs'> &euro; ".$totaalprijs."</div>";
        $html .= "<div class='clear'></div>";
        $html .= "</div>";
				
        if($deelnemerToegevoegd == false) {
            $html = 'Geen deelnemers';
        }
        
        if($outputAlsVar){
            return $html;
        } else {
            echo $html;
        }
        
    }
    
    public function requestDeelnemerVerwijderen() {
        
        # We verwijderen een deelnemer uit het overzicht, dus ook uit de sessie
        $deelnemerID = $_GET['deelnemerid'];
        unset($_SESSION['besteltraject']['deelnemers'][$deelnemerID]);
        
        $html = $this->requestDeelnemerTabelInhoud(true);
        
        echo $html;
        
    }
    
    public function pageZoeken() {
        
        $titel = 'Zoekresultaten';
        $inleiding = 'U heeft gezocht op <b> ' . $_SESSION['zoekterm'] . ' </b>';

        $page = $this->createMainPage($titel, $inleiding);
        
        if(isset($_GET['zoekpagina'])) {
            $_SESSION['zoekpagina'] = $_GET['zoekpagina'];
        } else {
            $_SESSION['zoekpagina'] = 0;
        }
        
        $instellingen = array(
            "maxRecords" => 10
        );
        
        $shoestringDatabase = shoestringDatabaseObject::instantiateShoestring();
        $reizen = $shoestringDatabase->reizenZoeken($instellingen);

        # Paginatie toevoegen aan pagina
        if($reizen['aantalPaginas'] > 0) {
            $page->append('<ul class="zoekenPaginatie">','contentTag');
            for($i = 0; $i < $reizen['aantalPaginas']; $i++){
                # We tonen alleen pagina's die binnen een bereik van 5 pagina's zitten vanaf de geselecteerde pagina
                # Voorbeeld: We klikken op pagina 15, dan tonen we de buttons voor pagina's 10 tot 20
                if($i >= ($_SESSION['zoekpagina'] - 5) AND ($i <= $_SESSION['zoekpagina'] + 5)){
                    $page->append('<a href="index.php?page=zoeken&zoekpagina='.$i.'"><li class="'.($_SESSION['zoekpagina'] == $i ? 'actief' : '').'">'.($i + 1).'</li></a>','contentTag');
                }
            }
            $page->append('</ul>','contentTag');
        }
        
        foreach($reizen['rows'] as $reis) {
            # Let op de 3e parameter in appendTemplate en assign
            # Deze zorgt ervoor dat de tags die in het tempalte zitten uniek worden gemaakt.
            $page->appendTemplate('reizenOverzicht','contentTag', true);
            $page->assign($reis['titel'],'reisTitel', true);
            $page->assign($reis['land'],'reisBestemming', true);
            $page->assign($reis['aantaldagen'],'reisDuur', true);
            $page->assign(cutTextByWordcount($reis['beschrijving'], 50),'reisBeschrijving', true);
            $page->assign($reis['image'],'reisAfbeeldingTag', true);
            $page->assign($reis['reis_id'],'reisID', true);
        }

        # Paginatie toevoegen aan pagina
        if($reizen['aantalPaginas'] > 0) {
            $page->append('<ul class="zoekenPaginatie">','contentTag');
            for($i = 0; $i < $reizen['aantalPaginas']; $i++){
                # We tonen alleen pagina's die binnen een bereik van 5 pagina's zitten vanaf de geselecteerde pagina
                # Voorbeeld: We klikken op pagina 15, dan tonen we de buttons voor pagina's 10 tot 20
                if($i >= ($_SESSION['zoekpagina'] - 5) AND ($i <= $_SESSION['zoekpagina'] + 5)){
                    $page->append('<a href="index.php?page=zoeken&zoekpagina='.$i.'"><li class="'.($_SESSION['zoekpagina'] == $i ? 'actief' : '').'">'.($i + 1).'</li></a>','contentTag');
                }
            }
            $page->append('</ul>','contentTag');
        }
    }
    
    public function pageDevelopers(){
        
        $titel = 'Ontwikkelaars';
        $inleiding = 'Hier een verhaal';

        $page = $this->createMainPage($titel, $inleiding);
        
        $accordion = new accordion('accordion', $page, 'contentTag');
        $accordion->init();
        
    }
    
}

?>
